package dao;

import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import models.Filme;

import org.apache.commons.io.FileUtils;

public class DAOFilme implements DAO<Filme> {

	@Override
	public Integer inserir(Filme f) {
		try {
			// Comando SQL que vai ser enviado ao banco
			String insert = "insert into filme(Titulo, Ano, Sinopse, Duracao, Genero, Direcao, Elenco, Produtores, Paisdeorigem, Imagem, Contadorfilme) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(insert);
			// Seta parâmetros do comando SQL
			statement.setString(1, f.titulo);
			statement.setInt(2, f.ano);
			statement.setString(3, f.sinopse);
			statement.setInt(4, f.duracao);
			statement.setString(5, f.genero);
			statement.setString(6, f.direcao);
			statement.setString(7, f.elenco);
			statement.setString(8, f.produtores);
			statement.setString(9, f.paisdeorigem);

			String template = "C:\\Users\\Bonei\\Filmania\\public\\Filmes"
					+ File.separatorChar + "%s.img";
			String imagem = null;
			while (true) {
				imagem = String.format(template, f.contadorfilme);
				if (new File(imagem).exists())
					f.contadorfilme++;
				else
					break;
			}

			File localFoto = new File(imagem);
			try {
				FileUtils.copyFile(f.foto, localFoto);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			f.imagem = imagem;
			statement.setString(10, f.imagem);
			statement.setInt(11, f.contadorfilme);
			// Executa insert no banco de dados
			return statement.executeUpdate();
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return 0;
	}

	@Override
	public int atualizar(Filme f) {
		try {
			// Comando SQL que vai ser enviado ao banco
			String update = "update filme set Titulo = ?, Ano = ?, Sinopse = ?, Duracao = ?, Genero = ?, Direcao = ?, Elenco = ?, Produtores = ?, Paisdeorigem = ?, Imagem = ? where idfilmania = ?";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(update);
			// Seta parâmetros do comando SQL
			statement.setInt(11, f.idFilmania);
			statement.setString(1, f.titulo);
			statement.setInt(2, f.ano);
			statement.setString(3, f.sinopse);
			statement.setInt(4, f.duracao);
			statement.setString(5, f.genero);
			statement.setString(6, f.direcao);
			statement.setString(7, f.elenco);
			statement.setString(8, f.produtores);
			statement.setString(9, f.paisdeorigem);

			File filedel = new File(f.imagem);
			filedel.delete();

			String template = "C:\\Users\\Bonei\\Filmania\\public\\Filmes"
					+ File.separatorChar + "%s.img";
			String refoto = null;
			refoto = String.format(template, f.contadorfilme);

			File localFoto = new File(refoto);
			try {
				FileUtils.copyFile(f.foto, localFoto);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			f.imagem = refoto;
			statement.setString(10, f.imagem);
			// Executa update no banco de dados
			return statement.executeUpdate();
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return 0;
	}

	public int mednota(Filme f) {
		try {
			// Comando SQL que vai ser enviado ao banco
			String update = "update filme set media = (select SUM(nota)/COUNT(*) from avaliacao where idfilmania=? group by idfilmania) where idfilmania = ?";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(update);
			// Seta parâmetros do comando SQL
			statement.setInt(1, f.idFilmania);
			statement.setInt(2, f.idFilmania);
			// Executa update no banco de dados
			return statement.executeUpdate();
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return 0;
	}

	public List<Filme> getfilmeTop() {
		List<Filme> objs = new ArrayList<Filme>();
		try {
			// Comando SQL que vai ser enviado ao banco
			String update = "select top 5 idfilmania, titulo, media  from filme order by media desc";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(update);

			ResultSet resultSet = statement.executeQuery();
			while (resultSet.next()) {
				Filme obj = new Filme();
				obj.idFilmania = resultSet.getInt(1);
				obj.titulo = resultSet.getString(2);
				obj.media = resultSet.getInt(3);

				objs.add(obj);
			}
		}

		// Executa update no banco de dados

		catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return objs;
	}

	@Override
	public int excluir(Filme f) {
		try {
			// Comando SQL que vai ser enviado ao banco
			String delete = "delete  from comentario where idfilmania = ? delete  from avaliacao where idfilmania = ? delete  from filme where idfilmania = ?";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(delete);
			// Seta parâmetros do comando SQL
			statement.setInt(1, f.idFilmania);
			statement.setInt(2, f.idFilmania);
			statement.setInt(3, f.idFilmania);
			// Executa update no banco de dados
			return statement.executeUpdate();
		} catch (SQLException e) {

			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return 0;
	}

	@Override
	public List<Filme> todos() {
		List<Filme> objs = new ArrayList<Filme>();
		try {
			// Comando SQL que vai ser enviado ao banco
			String query = "select idfilmania, Titulo, Ano, Sinopse, Duracao, Genero, Direcao, Elenco, Produtores, Paisdeorigem, Imagem from filme";
			// Objeto que executa o comando SQL
			Statement statement = DAOConnection.getConnection()
					.createStatement();
			// Execução do comando SQL e retorno como ResultSet
			ResultSet resultSet = statement.executeQuery(query);
			// Iteração no ResultSet
			while (resultSet.next()) {
				Filme obj = new Filme();
				obj.idFilmania = resultSet.getInt(1);
				obj.titulo = resultSet.getString(2);
				obj.ano = resultSet.getInt(3);
				obj.sinopse = resultSet.getString(4);
				obj.duracao = resultSet.getInt(5);
				obj.genero = resultSet.getString(6);
				obj.direcao = resultSet.getString(7);
				obj.elenco = resultSet.getString(8);
				obj.produtores = resultSet.getString(9);
				obj.paisdeorigem = resultSet.getString(10);
				obj.imagem = resultSet.getString(11);
				obj.foto = new File(obj.imagem);

				objs.add(obj);
			}
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return objs;

	}
	
	public List<Filme> Genero(String genero) {
		List<Filme> objs = new ArrayList<Filme>();
		try {
			// Comando SQL que vai ser enviado ao banco
			String query = "select idfilmania, Titulo, Ano, Sinopse, Duracao, Genero, Direcao, Elenco, Produtores, Paisdeorigem, Imagem from filme where genero = "+"'"+genero+"'";
			
			Statement statement = DAOConnection.getConnection()
					.createStatement();
	
			// Execução do comando SQL e retorno como ResultSet
			ResultSet resultSet = statement.executeQuery(query);
			// Iteração no ResultSet
			while (resultSet.next()) {
				Filme obj = new Filme();
				obj.idFilmania = resultSet.getInt(1);
				obj.titulo = resultSet.getString(2);
				obj.ano = resultSet.getInt(3);
				obj.sinopse = resultSet.getString(4);
				obj.duracao = resultSet.getInt(5);
				obj.genero = resultSet.getString(6);
				obj.direcao = resultSet.getString(7);
				obj.elenco = resultSet.getString(8);
				obj.produtores = resultSet.getString(9);
				obj.paisdeorigem = resultSet.getString(10);
				obj.imagem = resultSet.getString(11);
				obj.foto = new File(obj.imagem);

				objs.add(obj);
			}
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return objs;

	}
}